home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / progs / editor / frexxed / fpl / proasmmode.fpl < prev    next >
Text File  |  1996-08-01  |  22KB  |  798 lines

  1. // $Id: ProAsmMode.FPL 1.16 1996/08/01 13:36:28 jskov Exp $
  2. // $VER: ProAsmMode.FPL 1.2 (01.08.96) © Jesper Skov
  3.  
  4. export int infoBufferParent;
  5.  
  6. int equBuffer;
  7. int errBuffer;
  8. int listBuffer;
  9.  
  10. export int paError;                            // set by some f to signal error
  11. string paErrorText;
  12.  
  13. int assemblerError = 0;
  14. int newError;                                // new error occur since info entered?
  15. int lastErrorLine;
  16. string lastErrorDescription;
  17. string lastMainFile;                        // main file last assembled
  18. string lastErrorFile;                        // error occured in this file
  19. string lastOutName;
  20.  
  21. string daemon;
  22.  
  23. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» proAssemble() ««
  24. export void proAssemble(string opts)
  25. {
  26.   int parent = GetBufferID();
  27.   int assembleBuffer = parent;                // default is current buffer
  28.   string path = ReadInfo("file_path");
  29.   string topLine = GetLine(1);
  30.   string fileName = ReadInfo("full_file_name");
  31.   int stat;
  32.  
  33.   int packedText;
  34.   string result;
  35.  
  36.   // Check for assembly of master file (identified by <;$"name"> at line 1)
  37.   if(!strncmp(topLine, ";$\"", 3)){
  38.     fileName = substr(topLine,3, strstr(topLine, "\"", 3)-3);
  39.  
  40.     if(-1 == strstr(fileName, ":"))
  41.       fileName = ReadInfo("file_path")+fileName;
  42.     
  43.     assembleBuffer = GetBufferID(fileName);
  44.   }
  45.   
  46.   lastMainFile = Stcgfn(fileName);
  47.  
  48.   // Compute output name
  49.   // If no . in name, panic!
  50.   // Else construct as path and first part of name (i.e. up till first .)
  51.   lastOutName = lastMainFile;
  52.   if(-1 == (stat = strstr(lastOutName, "."))){
  53.     paError = 1;
  54.     paErrorText = "ProAsm expects an extension of the filename! Aborting...";
  55.     return;
  56.   } else
  57.     lastOutName = Stcgfp(fileName) + substr(lastOutName, 0, stat);
  58.  
  59.   // Insert output name in opts (replacing `$n')
  60.   if(-1 != (stat = stristr(opts, "$n")))
  61.     opts = substr(opts, 0, stat) + lastOutName + substr(opts, stat+2, -1);
  62.     
  63.     
  64.   if(ReadInfo("proasm_use_server")){
  65.       // Check ASX server
  66.     if(!FindPort("asx_rexx")){
  67.       // Server not running; start it!
  68.       System("proasm:asx");
  69.       if(!FindPort("asx_rexx", 10)){
  70.         paError = 1;
  71.         paErrorText = "Can't start asx!";
  72.         return;
  73.       }
  74.     }
  75.  
  76.     // Get daemon spawned
  77.     if(!strlen(daemon))
  78.       if(!strlen(daemon = ARexxSend("asx_rexx", "BegOfAssembly", 5))){
  79.         paError = 1;
  80.         paErrorText = "Could not get deamon running!";
  81.         return;
  82.       }
  83.   }
  84.  
  85.   // Hereafter the daemon will need to be freed at exit time!
  86.  
  87.   if(ReadInfo("proasm_use_server")){
  88.     // SERVER
  89.  
  90.     if(assembleBuffer){
  91.       // pack buffer to a memory block
  92.       if(!(packedText = System("packText "+itoa(assembleBuffer)))){
  93.         paError = 1;
  94.         paErrorText = "Could not pack buffer text.. Aborted!";
  95.         return;
  96.       }
  97.  
  98.       // ** Add opts and output name!
  99.       result = ARexxSend(daemon, "ADDRESS "+itoa(packedText));
  100.  
  101.       System("packText f"+itoa(packedText));    // free packed text
  102.  
  103.     } else {
  104.       // assemble file
  105.       Save();
  106.       }
  107.  
  108.   } else {
  109.     // PROGRAM
  110.     int parent = GetBufferID();
  111.  
  112.     string list = "-p t:proAsmList ";
  113.     if(!ReadInfo("proasm_make_list"))
  114.       list = "";
  115.     
  116.     Save();
  117.     
  118.     CurrentBuffer(GetBufferID("- AsmPro Info Buffer -"));
  119.     Output("\n");
  120.     System("delete t:proAsmErr");
  121.     stat = System(ReadInfo("proasm_assembler")+" "+fileName+" -q t:proAsmEqu "+list+"-e t:proAsmErr "+opts+" "+ReadInfo("proasm_asm_options")+" >> \""+ReadInfo("disk_name")+":- AsmPro Info Buffer -\"");
  122.     GotoLine(-1);
  123.     Backspace();
  124.   }
  125.  
  126.   if(stat){
  127.     assemblerError = 1;
  128.     paUpdateErr();
  129.     if(paError)
  130.       ReturnStatus("There were errors, but error file could not be loaded!");
  131.     else {
  132.       newError = 1;
  133.       paNextError(1);
  134.       ReturnStatus("There were errors!");
  135.     }
  136.   } else {
  137.     assemblerError = 0;
  138.     ReturnStatus("Successful operation!");
  139.   }
  140. }
  141.  
  142. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paMake ««
  143. void paMake(string opts)
  144. {
  145.   SaveString("t:makeit", "/bin/make -C\""+ReadInfo("file_path")+"\" "
  146.              +opts+" >>\"/"+ReadInfo("disk_name")+"/- AsmPro Info Buffer -\"\n");
  147.  
  148.   CurrentBuffer(GetBufferID("- AsmPro Info Buffer -"));
  149.   GotoLine(-1, -1);
  150.   Output("\n");
  151.   System("bin:sh /t/makeit");
  152.   GotoLine(-1, -1);
  153. }
  154.  
  155. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  156. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Errors ««
  157. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  158.  
  159. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paNextError ««
  160. export void paNextError(int reset)
  161. {
  162.   int parent;
  163.   
  164.   if(!assemblerError){
  165.     ReturnStatus("No errors in last assembly!");
  166.     return;
  167.   }
  168.     
  169.   parent = CurrentBuffer(errBuffer);
  170.   
  171.   if(reset)
  172.     GotoLine(1);
  173.   
  174.   if(!Search("^[0-9]","=wf+")){
  175.     int offset;
  176.     
  177.     lastErrorLine = atoi(GetWord());
  178.     lastErrorDescription = substr(GetLine(), 10, -1);
  179.     lastErrorDescription = substr(lastErrorDescription, 0, strlen(lastErrorDescription)-1);
  180.     if(-1 == (offset = strstr(lastErrorDescription, " in file ")))
  181.       lastErrorFile = lastMainFile;
  182.     else {
  183.       lastErrorFile = substr(lastErrorDescription, offset+9, -1);
  184.       // If file name is not absolute, add path of main file.
  185. //      if(-1 == strstr(lastErrorFile, ":"))
  186. //        lastErrorFile = Stcgfp(lastMainFile)+lastErrorFile;
  187.       lastErrorDescription = substr(lastErrorDescription, 0, offset);
  188.     }
  189.   } else {
  190.     GotoLine(1);
  191.     lastErrorDescription = "No more errors. Wrapping buffer!";
  192.   }
  193.   CurrentBuffer(parent);
  194.   
  195.   if(!reset)
  196.     paThisError();
  197. }
  198.  
  199. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paThisError ««
  200. export void paThisError()
  201. {
  202.   int id;
  203.     
  204.   if(!assemblerError){
  205.     ReturnStatus("No errors in last assembly!");
  206.     return;
  207.   }
  208.  
  209.   if(id = GetBufferID(lastErrorFile)){
  210.     // Replace current view with buffer containing erroneous file
  211.     int old = GetBufferID();
  212.     if(old != id){
  213.       if(ReadInfo("proasm_nexterr_save"))
  214.         Save();
  215.     }
  216.     CurrentBuffer(id);
  217.     Activate(id, 0, old);
  218.   } else {
  219.     if(ReadInfo("proasm_nexterr_save"))
  220.       Save();
  221.  
  222.     // Ask if erroneous file should be loaded.
  223.     if(Request("Error in file not currently loaded.\nShould "
  224.                +lastErrorFile+" be loaded?",
  225.                "ProAsm request",
  226.                "Yes|No")){
  227.       if(Check(lastErrorFile))
  228.         Open(lastErrorFile);
  229.       else {
  230.         string name = PromptFile(lastErrorFile, "Find file...");
  231.         if(strlen(name))
  232.           Open(name);
  233.         else {
  234.           ReturnStatus("Erroneous file not found!");
  235.           return;
  236.         }
  237.       }
  238.     } else
  239.       return;
  240.   }
  241.   GotoLine(lastErrorLine);
  242.   ReturnStatus(lastErrorDescription);
  243. }
  244. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  245. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Windows ««
  246. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  247. export void proAsmInfoWindow()
  248. {
  249.   int infoBuffer = GetBufferID("- AsmPro Info Buffer -");
  250.   
  251.   Visible(0);
  252.   
  253.   infoBufferParent = GetBufferID();
  254.  
  255.   if(!infoBuffer){
  256.     int face = FaceGet("proAsmInfo", 1);
  257.  
  258.     SetInfo(-1, "filehandler", 1);
  259.     
  260.     infoBuffer = New();
  261.     WindowOpen(WindowAlloc(infoBuffer));
  262.     CurrentBuffer(infoBuffer);
  263.     SetInfo(-1,"file_path", "t:");
  264.     Rename("- AsmPro Info Buffer -");
  265.     SetInfo(-1, "_proasmInfoBuffer_", 1);
  266.     SetInfo(-1, "window_height", ReadInfo("proasm_info_height"));
  267.     SetInfo(-1, "window_ypos", ReadInfo("screen_height"));
  268.     
  269.     FACTDelete("proAsmInfoFact");
  270.     FACTCreate("proAsmInfoFact");
  271.     FACT("proAsmInfoFact",-1, 'S', "");
  272.     SetInfo(infoBuffer, "fact", "proAsmInfoFact");
  273.     
  274.     if(face) {
  275.       int style;
  276.  
  277.       style = FaceStyle("infoCmds", "", 2, 0);
  278.       FaceAdd(face, style, ".", "1nonspace", "\n");
  279.     }
  280.     SetInfo(infoBuffer, "face", "proAsmInfo");
  281.     
  282.     Output(".");
  283.   }
  284.   CurrentBuffer(infoBuffer);
  285.   WindowToFront(0,infoBuffer);
  286.  
  287.   Visible(1);
  288.   
  289.   newError = 0;
  290. }
  291.   
  292. export void proAsmParentWindow()
  293. {
  294.   WindowToFront(0,infoBufferParent);
  295.   CurrentBuffer(infoBufferParent);
  296.   
  297.   if(newError)
  298.     paThisError();
  299. }
  300.  
  301. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  302. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» CLI High Level Commands ««
  303. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  304. void paCmdError(string reason)
  305. {
  306.   Output("\n"+reason+"\n.");
  307.   paError = 0;
  308. }
  309.  
  310. void paDoError()
  311. {
  312.   paCmdError(paErrorText);
  313. }
  314.  
  315. void paPrompt()
  316. {
  317.   Output("\n.");
  318.   SetInfo(-1,"changes",0);
  319. }
  320.  
  321. export void proAsmCmd()
  322. {
  323.   string cmd = GetLine();
  324.   string args = substr(cmd, 2, -1);
  325.  
  326.   if(strlen(cmd) == 1){
  327.     paZap("");
  328.     return;
  329.   }
  330.   
  331.   switch(cmd[1]){
  332.     case '=':
  333.       paList(args);
  334.       return;
  335.     case '?':
  336.       paEval(args);
  337.       return;
  338.     case 'a':
  339.       CurrentBuffer(infoBufferParent);
  340.       if(strlen(args)){
  341.         switch(args[0]){
  342.           case 'o':                            // ao : Make object
  343.             args = "-O \"$n.o\" -L";
  344.             break;
  345.           case 'a':                            // aa=opts : parse opts to ass
  346.             args = substr(args, 2, -1);
  347.             break;
  348.           case 's':                            // as : Syntax check
  349.             args = "-N";
  350.             break;
  351.           default:                            // a? : Make executable
  352.             args = "-O \"$n\"";
  353.             break;
  354.         }
  355.         
  356.       } else
  357.         args = "-O \"$n\"";
  358.       proAssemble(args);
  359.       CurrentBuffer(GetBufferID("- AsmPro Info Buffer -"));
  360.       if(paError)
  361.         paDoError();
  362.       else
  363.         paPrompt();
  364.       return;
  365.     case 'd':
  366.       Output("\nStarting debugger...");
  367.       WindowToFront(-1);
  368.       System(ReadInfo("proasm_debugger")+" "+ReadInfo("proasm_dbg_options")+" \""+lastOutName+"\""+args);
  369.       WindowToFront(0);
  370.       paPrompt();
  371.       return;
  372.     case 'j':
  373.       Output("\nRunning command "+lastOutName+"...");
  374.       Output("\nReturned "+itoa(System(lastOutName+args)));
  375.       paPrompt();
  376.       return;
  377.     case 'l':
  378.       paListing();
  379.       return;
  380.     case 'm':
  381.       CurrentBuffer(infoBufferParent);
  382.       paMake(args);
  383.       CurrentBuffer(GetBufferID("- AsmPro Info Buffer -"));
  384.       if(paError)
  385.         paDoError();
  386.       else
  387.         paPrompt();
  388.       return;
  389.     case 'z':
  390.       paZap(args);
  391.       return;
  392.   }
  393.   paCmdError("Unknown command prefix!");
  394. }
  395.  
  396. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  397. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Lists ««
  398. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  399. void paList(string arg)
  400. {
  401.   string newArg = substr(arg, 1, -1);
  402.   switch(arg[0]){
  403.     case 'l':
  404.       paListing();
  405.       break;
  406.     case 'r':
  407.       paGrep(newArg, 0);
  408.       break;
  409.     case 'R':
  410.       paGrep(newArg, 1);
  411.       break;
  412.   }
  413. }
  414.  
  415. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paGrep ««
  416. // Find variables matching regular expression
  417. // Default operation equals the "=r<str>" operator found in Asm1
  418. void paGrep(string pattern, int casesense)
  419. {
  420.   int id = GetBufferID();
  421.   string lastLine;
  422.  
  423.   if(!Check("t:proAsmEqu")){
  424.     paCmdError("No equate file... Try assembling!");
  425.     return;
  426.   }
  427.  
  428.   GotoLine(-1,-1);
  429.   Output("\nGrep on \""+pattern+"\"\n");
  430.   
  431.   if(ReadInfo("proasm_extern_grep")){
  432.     //external grep (faster?!?)
  433.     System("tail +9 t:proAsmEqu > t:proAsmEqu.strip");
  434.     System("grep "+ (casesense)?"":"-i " + "-e \"^"+pattern+"\" t:proAsmEqu.strip > t:proAsmEqu.grep");
  435.     InsertFile("t:proAsmEqu.grep");
  436.     System("delete t:proAsmEqu.#?");
  437.   } else {
  438.     // get file for internal processing
  439.     int tmp = New();
  440.     CurrentBuffer(tmp);
  441.     Load("t:proAsmEqu");
  442.       
  443.     DeleteLine(8);                            // strip off proAsm pads
  444.  
  445.     if(strlen(pattern)){
  446.       // internal grep
  447.       SearchSet("=fw+c"+(casesense)?'+':'-', "^"+pattern);
  448.  
  449.       while(!Search())
  450.         BlockCopyAppend(id, 1, ReadInfo("line"), 1, ReadInfo("line")+1);
  451.     } else
  452.       // Copy all
  453.       BlockCopyAppend(id, 1, 1, 1, ReadInfo("lines"));
  454.  
  455.     Clean("Kill("+itoa(tmp)+");");
  456.   }
  457.  
  458.   CurrentBuffer(id);
  459.   GotoLine(-1);
  460.   Backspace();
  461.  
  462. /*
  463.   lastLine = GetLine();                        // Strip off a possible "end"
  464.   if(lastLine[0]==' '){                        // line in an ugly manner :)
  465.     DeleteLine();
  466.     BackSpace();
  467.   }
  468. */
  469.   paPrompt();
  470. }
  471.  
  472.  
  473.  
  474. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  475. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Dump Listing ««
  476. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  477. void paListing()
  478. {
  479.   int parent;
  480.   
  481.   if(!ReadInfo("proasm_make_list")){
  482.     paError = 1;
  483.     paErrorText = "Listing not enabled!";
  484.     paPrompt();
  485.     return;
  486.   }
  487.   
  488.   if(!(listBuffer = GetBufferID("_proasmListBuffer_")))
  489.     listBuffer = New();
  490.   
  491.   parent = CurrentBuffer(listBuffer);
  492.   Clean("paError = Load(\"T:proAsmList\");");
  493.   Rename("_proasmListBuffer_");
  494.   if(0 > paError){
  495.     paError = 1;
  496.     paErrorText = "Error loading list file!";
  497.     CurrentBuffer(parent);
  498.     Clean("Kill("+itoa(listBuffer)+");");
  499.     paPrompt();
  500.     return;
  501.   }
  502.   SetInfo(-1,"proasm_list",1);
  503.   Activate(listBuffer, 0, parent);
  504.   WindowToFront(0,listBuffer);
  505. }
  506.  
  507. export void proAsmListExit()
  508. {
  509.   int infoBuffer = GetBufferID("- AsmPro Info Buffer -");
  510.   
  511.   SetInfo(-1,"type",8);
  512.  
  513.   Activate(infoBuffer, 0, CurrentBuffer(infoBuffer));
  514.   WindowToFront(0,infoBuffer);
  515.   paPrompt();
  516. }
  517.  
  518. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  519. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Evaluate ««
  520. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  521. // Evaluate expression.
  522. // Will consult the equate file for variable substitution and replace
  523. // "$" with "0x" to ease usage. Output in standard Asm1 form.
  524. export void paEval(string arg)
  525. {
  526.   int parent;
  527.   int val;
  528.  
  529.   paUpdateEqu();
  530.  
  531. /* Delay error checking of paUpdateEqu so that expressions not containing
  532.  * variables may be evaluated.
  533.  *
  534.   if(paError){
  535.     paDoError();
  536.     return;
  537.   }
  538. */  
  539.   parent = CurrentBuffer(New());
  540.   
  541.   Output("0+"+arg);                            // need extra space for regexp!
  542.   GotoLine(1,0);
  543.  
  544.   while((0 <= Search("\\W[$_a-z]", "=fw+"))){
  545.     CursorRight();
  546.     switch(GetChar()){
  547.       case '$':
  548.         Delete();
  549.         Output("0x");
  550.         break;
  551.       default:
  552.         if(!paError)                        // Delayed check of paUpdateEqu
  553.           val = paGetVariable(GetWord());
  554.         if(paError){
  555.           Clean("Kill("+itoa(CurrentBuffer(parent))+");");
  556.           paDoError();
  557.           return;
  558.         }
  559.         DeleteWord();
  560.         Output(itoa(val));
  561.         break;
  562.     }
  563.   }    
  564.   paError = 0;                                // Cancel error from paUpdateEqu
  565.  
  566.   val = eval(GetLine());
  567.   Clean("Kill("+itoa(CurrentBuffer(parent))+");");
  568.   Output(sprintf("\n$%08X %10d `%c%c%c%c' %%%08b.%08b.%08b.%08b", val, val, (((val>>24)&255)>31)?(val>>24):0x2e, (((val>>16)&255)>31)?(val>>16):0x2e, (((val>>8)&255)>31)?(val>>8):0x2e, ((val&255)>31)?val:0x2e, (val>>24)&255, (val>>16)&255, (val>>8)&255, val&255));
  569.   paPrompt();
  570. }
  571.  
  572.  
  573. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paGetVariable ««
  574. // Get variable value from equate file which must already be in a buffer!
  575. // Variables are sought case sensitive, starting on a line and ending
  576. // with a non-word character.
  577. // FACT should mark "_" as a word character!
  578. //
  579. // If paError is set, the variable could not be found.
  580. int paGetVariable(string name)
  581. {
  582.   int parent = CurrentBuffer(equBuffer);
  583.   int res;
  584.   
  585.   GotoLine(1);
  586.   if(0 > Search("^"+name+"\\W", "=fwc+")){
  587.     paErrorText = "Unknown variable `"+name+"'!";
  588.     paError = 1;
  589.   } else
  590.     res = eval("0x"+substr(GetLine(), 41, -1));
  591.   CurrentBuffer(parent);
  592.   return res;
  593. }
  594.  
  595. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paUpdateEqu ««
  596. // (Re)Load the equate file.
  597. //
  598. // If paError (return value) is set and error occured.
  599. int paUpdateEqu()
  600. {
  601.   int parent;
  602.   
  603.   if(!(equBuffer = GetBufferID("_proasmEquBuffer_")))
  604.     equBuffer = New();
  605.   
  606.   parent = CurrentBuffer(equBuffer);
  607.   Clean("paError = Load(\"T:proAsmEqu\");");
  608.   Rename("_proasmEquBuffer_");
  609.   if(0 > paError){
  610.     paError = 1;
  611.     paErrorText = "Error loading equate file!";
  612.   } else
  613.     paError = 0;
  614.   CurrentBuffer(parent);
  615.   
  616.   return paError;
  617. }
  618.  
  619. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» paUpdateErr ««
  620. // (Re)Load the error file.
  621. //
  622. // If paError (return value) is set and error occured.
  623. int paUpdateErr()
  624. {
  625.   int parent;
  626.   
  627.   if(!(errBuffer = GetBufferID("_proasmErrBuffer_")))
  628.     errBuffer = BlockCreate("_proasmErrBuffer_");
  629.   
  630.   parent = CurrentBuffer(errBuffer);
  631.   Clean("paError = Load(\"T:proAsmErr\");");
  632.   Rename("_proasmErrBuffer_");
  633.   SetInfo(-1,"type",8);
  634.   if(0 > paError){
  635.     paError = 1;
  636.     paErrorText = "Error loading error file!";
  637.   } else
  638.     paError = 0;
  639.   CurrentBuffer(parent);
  640.   
  641.   return paError;
  642. }
  643.  
  644. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  645. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ZAP ««
  646. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  647. void paZap(string arg)
  648. {
  649.   Clean("Clear();");
  650.   Output(".");
  651. }
  652.  
  653. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  654. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» proAsmPrefs() ««
  655. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  656. export void ProAsmModePrefs()
  657. {
  658.   string assembler = ReadInfo("proasm_assembler");
  659.   string asm_options = ReadInfo("proasm_asm_options");
  660.  
  661.   string debugger = ReadInfo("proasm_debugger");
  662.   string dbg_options = ReadInfo("proasm_dbg_options");
  663.  
  664.   int nexterr_save = ReadInfo("proasm_nexterr_save");
  665.   
  666.   string key_nexterror = ReadInfo("proasm_key_nexterror");
  667.   string key_thiserror = ReadInfo("proasm_key_thiserror");
  668.  
  669.   int extern_grep = ReadInfo("proasm_extern_grep");
  670.   int use_server = ReadInfo("proasm_use_server");
  671.   int make_list = ReadInfo("proasm_make_list");
  672.   int info_height = ReadInfo("proasm_info_height");
  673.   
  674.   RequestWindow("ProAsmMode Preferences",20,
  675.     "Assembler", "s", &assembler,
  676.     "Asm Options", "s", &asm_options,
  677.     "Debugger", "s", &debugger,
  678.     "Dbg Options", "s", &dbg_options,
  679.     "Info height", "i", &info_height,
  680.     "Next error save", "b", &nexterr_save,
  681.     "Key: Next Error", "s", &key_nexterror,
  682.     "Key: This Error", "s", &key_thiserror,
  683.     "External grep", "b", &extern_grep,
  684.     "Use ASX server", "b", &use_server,
  685.     "Make lists", "b", &make_list
  686.   );
  687.  
  688.   SetInfo(0, "proasm_assembler", assembler);
  689.   SetInfo(0, "proasm_asm_options", asm_options);
  690.   SetInfo(0, "proasm_debugger", debugger);
  691.   SetInfo(0, "proasm_dbg_options", dbg_options);
  692.   SetInfo(0, "proasm_nexterr_save", nexterr_save);
  693.   SetInfo(0, "proasm_key_nexterror", key_nexterror);
  694.   SetInfo(0, "proasm_key_thiserror", key_thiserror);
  695.   SetInfo(0, "proasm_extern_grep", extern_grep);
  696.   SetInfo(0, "proasm_use_server", use_server);
  697.   SetInfo(0, "proasm_make_list", make_list);
  698.   SetInfo(0, "proasm_info_height", info_height);
  699.    
  700.   AssignKey("paNextError(0);",ReadInfo("proasm_key_nexterror"),"proasm_mode");
  701.   AssignKey("paThisError();",ReadInfo("proasm_key_thiserror"),"proasm_mode");
  702. }
  703.  
  704. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  705. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ProAsmMode settings ««
  706. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ! ««
  707.  
  708. ConstructInfo("proasm_assembler", "","", "GSHW","", 0,0,"proasm");
  709. ConstructInfo("proasm_asm_options", "","", "GSHW","", 0,0,"");
  710. ConstructInfo("proasm_debugger", "","", "GSHW","", 0,0,"");
  711. ConstructInfo("proasm_dbg_options", "","", "GSHW","", 0,0,"");
  712.  
  713. ConstructInfo("proasm_extern_grep", "","", "GBWH","", 0,0,0);
  714. ConstructInfo("proasm_use_server", "","", "GBWH","", 0,0,0);
  715. ConstructInfo("proasm_make_list", "","", "GBWH","", 0,0,0);
  716.  
  717. ConstructInfo("proasm_info_height", "", "", "GIHW", "", 4, 1000, 200);
  718.  
  719. ConstructInfo("proasm_nexterr_save", "","", "GBWH","", 0,0,1);
  720.  
  721. ConstructInfo("proasm_key_nexterror", "","", "GSHW","", 0,0,"control c '0x2a'");
  722. ConstructInfo("proasm_key_thiserror", "","", "GSHW","", 0,0,"control c shift '0x2a'");
  723.  
  724. ConstructInfo("proasm_list", "","", "LBH","", 0,0,0);
  725.  
  726.  
  727. ConstructInfo("_proasmInfoBuffer_","","","LBH","",0,1,0);
  728.  
  729. ConstructInfo("proasm_mode", "","", "LBH","", 0,0,0);
  730. ConstructInfo("proasm_mode_ext", "","", "GSHW","", 0,0,"*s*i*asm*");
  731. ConstructInfo("proasm_mode_exe", "","", "GSHW","", 0,0,"AsmModeInit();");
  732.  
  733. AddMode(1, "proasm_mode", "proasm_mode_ext", "proasm_mode_exe");
  734.  
  735. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» key bindings ««
  736. AssignKey("proAsmInfoWindow();","'escape'","proasm_mode");
  737. AssignKey("proAsmListExit();","'escape'","proasm_list");
  738. AssignKey("paNextError(0);",ReadInfo("proasm_key_nexterror"),"proasm_mode");
  739. AssignKey("paThisError();",ReadInfo("proasm_key_thiserror"),"proasm_mode");
  740.  
  741. // Keys for the info buffer
  742. AssignKey("proAsmParentWindow();", "'escape'", "_proasmInfoBuffer_");
  743. AssignKey("if(GetChar(0)=='.'){proAsmCmd();}else{Output(\"\\n\");};", "'return'", "_proasmInfoBuffer_");
  744.  
  745. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ProAsm menu ««
  746. MenuAdd("i", "ProAsm", "", "", ReadInfo("Program_Menu"), -1);
  747.  MenuAdd("s", "Assemble", "if(ReadInfo(\"_proasmInfoBuffer_\")) proAssemble();","", ReadInfo("Program_Menu"), -1);
  748.  MenuAdd("s", "---","","",ReadInfo("Program_Menu"), -1);
  749.  MenuAdd("s", "This error", "if(ReadInfo(\"proasm_mode\")) paThisError();","",ReadInfo("Program_Menu"), -1);
  750.  MenuAdd("s", "Next error", "if(ReadInfo(\"proasm_mode\")) paNextError(0);","",ReadInfo("Program_Menu"), -1);
  751.  MenuAdd("s", "---","","",ReadInfo("Program_Menu"), -1);
  752.  MenuAdd("s", "Info Buffer", "if(!ReadInfo(\"_proasmInfoBuffer_\")) proAsmInfoWindow();","",ReadInfo("Program_Menu"), -1);
  753.  MenuAdd("s", "Parent Buffer", "if(ReadInfo(\"_proasmInfoBuffer_\")) proAsmParentWindow();","",ReadInfo("Program_Menu"), -1);
  754.  
  755. MenuAdd("s", "ProAsm...", "ProAsmModePrefs();", "", ReadInfo("menu_program_title"),ReadInfo("menu_program_item"),-1);
  756. MenuBuild();
  757.  
  758.  
  759. //»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Ideas ««
  760. /*
  761. == DONE ==
  762.  
  763. o Assemble directly from memory (a tool is needed to compact the native
  764.   FrexxEd line form to full source).
  765.  
  766. o Assemble subField (";$ <name of main file>" on first line)
  767.  
  768. o High-light assembler directives (FrexxEd faces).
  769.  
  770. o Check Syntax (via ProAsm)
  771.  
  772. o Next/Previous error (Get errors from listing).
  773.  
  774. o Info window:
  775. - ESC goto text window
  776. - ?<expr> evaluate expression - using variable values from last assembly
  777. - =r<feed> replace text-window with list of variable values [search <feed>]
  778. - =l show listing
  779. - a assemble source, display resulting text (same as <C-c C-c> in text win)
  780. - z/clr clear buffer.
  781.  
  782. o User defined keys
  783.  
  784. == TODO ==
  785.   
  786. o Display listing, cross-references and equate-file (get needed files from
  787.   ProAsm).
  788.  
  789. o Control of config file (Remember to get new Gadget interface!)
  790.  
  791. o Info window:
  792. - =s show cross-ref file (statistics)
  793.  
  794. o Control of include cache
  795.  
  796. */
  797.  
  798.